package io.r2mo.jce.constant;

/**
 * 常用加密哈希算法 & 密码哈希算法（分组 + 评分 + 推荐度）
 */
public enum AlgHash {

    // ===== SHA-2 系列 =====
    /**
     * SHA-256
     *
     * <p>优势：国际标准，安全性和性能兼顾，广泛应用于 TLS、区块链、JWT。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 5/5，使用率 5/5，扩展性 4/5
     * <p>综合评分：23/25 ★★★★★
     * <p>推荐度：🟩 强推荐（当前主流的安全哈希算法）
     */
    SHA256("SHA-256", true),

    /**
     * SHA-512
     *
     * <p>优势：输出更长，安全性更强，适合长期存档或高安全应用。
     * <p>五维评分：安全性 5/5，性能 3/5，兼容性 5/5，使用率 4/5，扩展性 4/5
     * <p>综合评分：21/25 ★★★★☆
     * <p>推荐度：🟦 高推荐（高安全环境使用）
     */
    SHA512("SHA-512", true),

    // ===== SHA-3 系列 =====
    /**
     * SHA3-256
     *
     * <p>优势：新一代标准，基于 Keccak，抗长度扩展攻击。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 3/5，使用率 2/5，扩展性 5/5
     * <p>综合评分：19/25 ★★★★☆
     * <p>推荐度：🟦 高推荐（未来趋势）
     */
    SHA3_256("SHA3-256", true),

    /**
     * SHA3-512
     *
     * <p>优势：安全强度最高，适合超长周期应用。
     * <p>五维评分：安全性 5/5，性能 3/5，兼容性 3/5，使用率 2/5，扩展性 5/5
     * <p>综合评分：18/25 ★★★★☆
     * <p>推荐度：🟦 高推荐（长期安全性需求）
     */
    SHA3_512("SHA3-512", true),

    // ===== BLAKE 系列 =====
    /**
     * BLAKE2b
     *
     * <p>优势：比 SHA-2 更快，安全性可靠。
     * <p>五维评分：安全性 5/5，性能 5/5，兼容性 3/5，使用率 3/5，扩展性 5/5
     * <p>综合评分：21/25 ★★★★☆
     * <p>推荐度：🟩 强推荐（高性能安全应用）
     */
    BLAKE2B("BLAKE2B", true), // BouncyCastle 扩展支持

    /**
     * BLAKE3
     *
     * <p>优势：新一代高性能哈希，支持并行化，速度极快。
     * <p>五维评分：安全性 5/5，性能 5/5，兼容性 2/5，使用率 2/5，扩展性 5/5
     * <p>综合评分：19/25 ★★★★☆
     * <p>推荐度：🟦 高推荐（未来高性能场景）
     */
    BLAKE3("BLAKE3", false), // 需要额外库

    // ===== 国密 SM 系列 =====
    /**
     * SM3
     *
     * <p>优势：中国国家标准，安全性相当于 SHA-256，合规强制要求。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 2/5，使用率 3/5，扩展性 3/5
     * <p>综合评分：17/25 ★★★☆☆
     * <p>推荐度：🟨 中立（仅在国密合规环境强制使用）
     */
    SM3("SM3", true),

    // ===== 密码哈希 / KDF 系列 =====
    /**
     * PBKDF2 (Password-Based Key Derivation Function 2)
     *
     * <p>优势：NIST 标准，广泛支持，可配置迭代次数和盐，抗暴力破解。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 5/5，使用率 5/5，扩展性 4/5
     * <p>综合评分：23/25 ★★★★★
     * <p>推荐度：🟩 强推荐（企业级通用方案）
     */
    PBKDF2("PBKDF2WithHmacSHA256", false),

    /**
     * bcrypt
     *
     * <p>优势：专为密码存储设计，内置盐和工作因子，抗 GPU 暴力破解。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 4/5，使用率 5/5，扩展性 4/5
     * <p>综合评分：22/25 ★★★★★
     * <p>推荐度：🟩 强推荐（Web 系统首选）
     */
    BCRYPT("bcrypt", false),

    /**
     * scrypt
     *
     * <p>优势：内存硬计算，抗 FPGA/ASIC 攻击更强。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 3/5，使用率 3/5，扩展性 5/5
     * <p>综合评分：20/25 ★★★★☆
     * <p>推荐度：🟦 高推荐（高安全场景）
     */
    SCRYPT("scrypt", false),

    /**
     * Argon2 (PHC 大赛获胜算法)
     *
     * <p>优势：现代密码哈希标准，支持内存消耗和并行度参数，抗攻击能力最强。
     * <p>五维评分：安全性 5/5，性能 4/5，兼容性 3/5，使用率 3/5，扩展性 5/5
     * <p>综合评分：20/25 ★★★★☆
     * <p>推荐度：🟩 强推荐（新系统推荐默认方案）
     */
    ARGON2("Argon2", false);

    private final String value;
    private final boolean standard;

    AlgHash(final String value, final boolean standard) {
        this.value = value;
        this.standard = standard;
    }

    /** 返回算法实际名称 */
    public String value() {
        return this.value;
    }

    /** 是否属于 JDK / BouncyCastle 标准支持的 MessageDigest 算法 */
    public boolean fromJvm() {
        return this.standard;
    }

    @Override
    public String toString() {
        return this.value;
    }
}
